package com.内部类.成员内部类;

public class MemberInnerClass01 {
    /**
     * 成员内部类：成员内部类是定义在外部类的成员位置的类，并且没有static修饰
     * 1. 可以直接访问外部类的所有成员，包括私有的
     * 2.可以添加任意的 访问修饰符，public private protected 默认，因为他的地位是一个成员；
     * 3.作用域：整个 外部类内；
     *4.外部类访问成员内部类的属性需要创建一个对象再调用
     * 5.外部其他类访问成员内部类的三种方式：
     * 看test类
     * 6.如果外部类和内部类成员变量重名，内部类访问外部类变量需要用 外部类名.this.成员变量名
     */
    public static void main(String[] args) {
        Outer outer = new Outer();  //外部类访问内部类
        outer.method();  //method()内 创建内部类再调用方法
        System.out.println("===============================");
        /**外部其他类访问内部类的三种方法*/
        Test test = new Test();
        test.method1();
        System.out.println("===============================");
        test.method2();
        System.out.println("===============================");
        test.method3();


    }
}

class Outer {
    private int n1 = 10;
    private String name = "张三";
 /**2.可以添加任意的 访问修饰符，public private protected 默认，因为他的地位是一个成员；*/
     public class Inner {  //成员内部类
         private int n1 = 20;
        public void show() {
            /**1. 内部类可以直接访问外部类的所有成员，包括私有的   6.如果外部类和内部类成员变量重名，内部类访问外部类变量需要用 外部类名.this.成员变量名*/
            System.out.println("Outer的n1\t" + Outer.this.n1 +"\tInner的n1\t"+ n1);
            System.out.println("Outer的name\t" + name);
        }
    }
    /**4.外部类访问成员内部类的属性需要创建一个对象再调用*/
    public void method() {
        Inner inner = new Inner();
        inner.show();
    }


    /**提供获取内部类对象的方法*/
public Inner getInner() {
    return new Inner();
}
}

/**5.外部其他类访问成员内部类的三种方式：*/
class Test{
   void method1(){
       Outer outer = new Outer();  //先创建外部类对象
       Outer.Inner inner1 = outer.new Inner();//再用外部类对象 创建内部类对象
       inner1.show();

    }
    void method2(){
        Outer outer = new Outer();  //先创建外部类对象
        Outer.Inner inner = outer.getInner();  //用外部类提供的方法获取内部类对象
        inner.show();
    }

    void method3(){
       Outer.Inner inner = new Outer().new Inner();  //简化版：创建外部类对象，再创建内部类对象
        inner.show();
    }

}